# 根据Cookies类中的登录方法返回的 cookies,调用指定的url，并获取相应的数据
from Cookies import UserLogin
import requests
import json

class IncidentDataFetcher:
    """
    事件数据获取器类
    根据Cookies类中的登录方法返回的cookies，调用指定的url，并获取相应的数据
    """
    
    def __init__(self, login_url, login_params):
        """
        初始化登录信息
        
        Args:
            login_url (str): 登录URL
            login_params (dict): 登录参数，包含用户名/用户ID和密码等键值对
        """
        self.login_url = login_url
        self.login_params = login_params
        self.login_instance = UserLogin(login_url, login_params)
        self.session = requests.Session()
        self.is_logged_in = False
    
    def login(self):
        """
        执行登录操作
        
        Returns:
            bool: 登录是否成功
        """
        result = self.login_instance.login()
        
        if isinstance(result, dict):
            # 将登录成功的cookies设置到会话中
            for key, value in result.items():
                self.session.cookies.set(key, value)
            self.is_logged_in = True
            return True
        else:
            print(f"登录失败: {result}")
            return False
    
    def fetch_data(self, target_url, params=None, headers=None, timeout=30):
        """
        使用已登录的cookies调用指定的URL获取数据
        
        Args:
            target_url (str): 目标数据URL
            params (dict, optional): 请求参数
            headers (dict, optional): 请求头
            timeout (int, optional): 请求超时时间，默认30秒
        
        Returns:
            dict or str: 成功返回数据(如果是JSON格式则解析为字典)，失败返回错误信息
        """
        # 检查是否已登录
        if not self.is_logged_in:
            print("尚未登录，请先调用login方法")
            # 尝试自动登录
            if not self.login():
                return "登录失败，无法获取数据"
        
        try:
            # 设置默认请求头
            default_headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
            }
            
            # 如果提供了自定义请求头，则合并
            if headers:
                default_headers.update(headers)
            
            # 发送请求
            response = self.session.get(
                target_url,
                params=params,
                headers=default_headers,
                timeout=timeout
            )
            
            # 检查响应状态
            response.raise_for_status()
            
            # 尝试解析JSON响应
            try:
                return response.json()
            except json.JSONDecodeError:
                # 如果不是JSON格式，则返回原始文本
                return response.text
                
        except requests.exceptions.RequestException as e:
            return f"请求错误: {str(e)}"
        except Exception as e:
            return f"获取数据失败: {str(e)}"
    
    def fetch_data_post(self, target_url, data=None, json_data=None, headers=None, timeout=30):
        """
        使用POST方法获取数据
        
        Args:
            target_url (str): 目标数据URL
            data (dict, optional): 表单数据
            json_data (dict, optional): JSON数据
            headers (dict, optional): 请求头
            timeout (int, optional): 请求超时时间，默认30秒
        
        Returns:
            dict or str: 成功返回数据，失败返回错误信息
        """
        # 检查是否已登录
        if not self.is_logged_in:
            print("尚未登录，请先调用login方法")
            # 尝试自动登录
            if not self.login():
                return "登录失败，无法获取数据"
        
        try:
            # 设置默认请求头
            default_headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
            }
            
            # 如果提供了自定义请求头，则合并
            if headers:
                default_headers.update(headers)
            
            # 发送POST请求
            response = self.session.post(
                target_url,
                data=data,
                json=json_data,
                headers=default_headers,
                timeout=timeout
            )
            
            # 检查响应状态
            response.raise_for_status()
            
            # 尝试解析JSON响应
            try:
                return response.json()
            except json.JSONDecodeError:
                # 如果不是JSON格式，则返回原始文本
                return response.text
                
        except requests.exceptions.RequestException as e:
            return f"请求错误: {str(e)}"
        except Exception as e:
            return f"获取数据失败: {str(e)}"
    
    def close(self):
        """
        关闭会话
        """
        self.session.close()


# 使用示例
if __name__ == "__main__":
    # 示例登录信息（实际使用时需要替换为真实的URL和凭据）
    login_url = "https://example.com/login"
    login_params = {
        'uid': 'test_user',
        'password': 'test_password'
    }
    
    # 创建数据获取器实例
    data_fetcher = IncidentDataFetcher(login_url, login_params)
    
    # 示例数据URL（实际使用时需要替换为真实的URL）
    data_url = "https://example.com/api/incidents"
    data_params = {
        'page': 1,
        'limit': 10
    }
    
    try:
        # 获取数据
        print("开始获取数据...")
        result = data_fetcher.fetch_data(data_url, params=data_params)
        
        # 处理结果
        if isinstance(result, dict):
            print("数据获取成功！")
            print(json.dumps(result, indent=2, ensure_ascii=False))
        elif isinstance(result, str) and result.startswith("请求错误") or result.startswith("获取数据失败"):
            print(f"错误: {result}")
        else:
            print(f"获取到非JSON格式数据: {result[:500]}...")
            
    finally:
        # 关闭会话
        data_fetcher.close()